Back to Article
Limpieza de Datos - COVID-19
Download Source

Limpieza de Datos - COVID-19

Author
Affiliation

Brian Norman Peña-Calero

Laboratorio de Innovación en Salud - UPCH

In [1]:
knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file())
In [2]:
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(sf)
Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.3.1; sf_use_s2() is TRUE
library(arrow)

Adjuntando el paquete: 'arrow'

The following object is masked from 'package:lubridate':

    duration

The following object is masked from 'package:utils':

    timestamp
library(DBI)
library(duckdb)
library(dbplyr)

Adjuntando el paquete: 'dbplyr'

The following objects are masked from 'package:dplyr':

    ident, sql
In [3]:
con <- dbConnect(duckdb(), dbdir = "01_data/raw/covid.duckdb")

Peru mother

In [4]:

data(Peru, package = "innovar")

peru_mother <- Peru %>%  
  as_tibble() %>% 
  select(dep, prov, distr, ubigeo) %>% 
  mutate(
    # ubigeo_clasif = case_when(
    #   dep != "LIMA" ~ str_pad(
    #     str_sub(ubigeo, 1, 2),
    #     6,
    #     side = "right",
    #     pad = "0"
    #   ),
    #   dep == "LIMA" ~ str_pad(
    #     str_sub(ubigeo, 1, 4),
    #     6,
    #     side = "right",
    #     pad = "0"
    #   )
    # ),
    region = case_match(
      dep,
      c("TUMBES", "PIURA", "LAMBAYEQUE", "LA LIBERTAD",
        "ANCASH", "LIMA", "ICA", "AREQUIPA",
        "MOQUEGUA", "TACNA", "CALLAO") ~ "Coast",
      c("CAJAMARCA", "HUANUCO", "PASCO",
        "JUNIN", "HUANCAVELICA", "AYACUCHO",
        "APURIMAC", "CUSCO", "PUNO") ~ "Highlands",
      c("AMAZONAS", "SAN MARTIN", "LORETO",
        "UCAYALI", "MADRE DE DIOS") ~ "Jungle"
    ),
    # region_en = case_match(
    #   region,
    #   "Costa" ~ "Coast",
    #   "Sierra" ~ "Highlands",
    #   "Selva" ~ "Jungle",
    # ),
    macrorregion = case_when(
      dep %in% c("TUMBES", "PIURA", "LAMBAYEQUE",
                 "CAJAMARCA", "LA LIBERTAD") ~ "North",
      dep %in% c("AREQUIPA", "MOQUEGUA", "TACNA", 
                 "CUSCO", "MADRE DE DIOS",
                 "APURIMAC", "PUNO") ~ "South",
      dep %in% c("LORETO", "UCAYALI", "AMAZONAS",
                 "SAN MARTIN") ~ "East",
      dep ==  "LIMA" & prov != "LIMA" ~ "Center",
      dep %in% c("ANCASH", "JUNIN", 
                 "PASCO", "HUANUCO",
                 "HUANCAVELICA", "AYACUCHO", 
                 "ICA") ~ "Center",
      dep == "LIMA" & prov == "LIMA" ~ "Metropolitan Lima and Callao",
      dep == "CALLAO" ~ "Metropolitan Lima and Callao"
    )
  ) 
  # add_case(
  #   dep = "LIMA",
  #   prov = "EN INVESTIGACIÓN",
  #   distr = "EN INVESTIGACIÓN",
  #   ubigeo_clasif = "151100",
  #   region = "Costa",
  #   macrorregion = "Centro"
  # )
In [5]:

dbWriteTable(con, "peru_mother", peru_mother, overwrite = TRUE)

Quintil de Pobreza

In [6]:
pobreza <- readxl::read_excel("01_data/raw/2_Anexo Estadistico.xlsx",
                              skip = 3, 
                              .name_repair = janitor::make_clean_names) %>% 
  drop_na() %>% 
  add_case(
    ubigeo = "150906",
    departamento = "LIMA",
    provincia = "OYON",
    distrito = "PACHANGARA",
    intervalo_de_confianza_al_95_percent = "10.4",
    x = "24.2"
  ) %>% 
  mutate(
    ic_up = as.numeric(x),
    ic_low = as.numeric(intervalo_de_confianza_al_95_percent),
    estimate = rowMeans(pick(c(ic_up, ic_low)))
  ) %>% 
  select(ubigeo, poblacion_proyectada_2020_1, ic_up, ic_low, estimate)
In [7]:
# pobreza_quintil <- pobreza %>% 
#   reframe(
#     quintil = quantile(estimate, probs = seq(0, 1, 0.25))
#   )

pobreza <- pobreza %>% 
  left_join(peru_mother) %>% 
  rename(
    departamento = dep,
    provincia = prov,
    distrito = distr
  ) %>% 
  mutate(
    # quintil_cat = cut(estimate, breaks = pobreza_quintil$quintil,
    #                   include.lowest = TRUE,
    #                   labels = FALSE),
    cuartil_pobreza = case_when(
      estimate >= 60 ~ 4,
      estimate >= 40 ~ 3,
      estimate >= 20 ~ 2,
      .default = 1
    ),
    across(
      cuartil_pobreza,
      factor
    )
  ) %>% 
  rename(estimate_pobreza = estimate) %>% 
  relocate(ubigeo, departamento:distrito)
In [8]:

dbWriteTable(con, "pobreza", pobreza, overwrite = TRUE)

Necesidades básicas insatisfechas (NBI)

In [9]:

nbi <- readxl::read_excel("01_data/raw/POBLACIÓN CENSADA CON AL MENOS UNA NBI A NIVEL DISTRITAL 2017.xlsx",
                          skip = 3, 
                          .name_repair = janitor::make_clean_names) %>% 
  drop_na()

nbi <- nbi %>% 
  select(
    ubigeo = x_2, 
    estimate_nbi = x_4
  ) %>% 
  mutate(
    estimate_nbi = as.numeric(estimate_nbi),
    cuartil_nbi = case_when(
      estimate_nbi >= 60 ~ 4,
      estimate_nbi >= 40 ~ 3,
      estimate_nbi >= 20 ~ 2,
      .default = 1
    ),
    cuartil_nbi = factor(cuartil_nbi)
  )

nbi <- nbi %>% 
  left_join(
    peru_mother
  ) %>% 
  rename(
    departamento = dep,
    provincia = prov,
    distrito = distr
  ) 
In [10]:

dbWriteTable(con, "nbi", nbi, overwrite = TRUE)

Población 2020 - 2023

La información poblacional estimada se extrae de la plataforma REUNIS, que tiene un enlace de descarga: https://cloud.minsa.gob.pe/s/XJ3NoG3WsxgF6H8

En el año 2021, la información poblacional distrital no tiene subdivisión por sexo. Se utiliza el que figura en la plataforma nacional de datos abiertos.

In [11]:
pob2020 <- readxl::read_excel(
  "01_data/raw/Poblacion-Reunis/Poblacion Peru 2020 Dpto Prov Dist Final INEI-actualizado.xlsx",
  sheet = "Pob x Genero",
  skip = 6,
  .name_repair = janitor::make_clean_names
)

pob2021 <- read_csv("01_data/raw/TB_POBLACION_INEI_2021.csv", 
                  name_repair = janitor::make_clean_names)

pob2022 <- readxl::read_excel(
  "01_data/raw/Poblacion-Reunis/Poblacion Peru 2022 Dpto Prov Dist sexo - Final 14.03.22.xlsx",
  sheet = "Pob x Genero",
  skip = 6,
  .name_repair = janitor::make_clean_names
)

pob2023 <- readxl::read_excel(
  "01_data/raw/Poblacion-Reunis/Poblacion Peru 2023 Dpto Prov Dist sexo-15.03.23.xlsx",
  sheet = "Pob x Genero",
  skip = 6,
  .name_repair = janitor::make_clean_names
)

Se extraerá únicamente la información asociada a las edades de 0 a 17 años de ambos sexos y se intenciona consolidarlo en una sola data.

In [12]:
pob2020 <- pob2020 %>% 
  select(ubigeo, departamento:distrito, x0:x17, x0_2:x17_2) %>% 
  slice(2:1876) 

pob2021 <- pob2021 %>% 
  mutate(
    anio = 2021,
    edad = as.numeric(edad_anio),
    sexo = factor(
      sexo,
      levels = c("F", "M"),
      labels = c("Female", "Male")
    )
  ) %>% 
  filter(edad < 18) %>% 
  select(-c(edad_anio, ubigeo_reniec)) %>% 
  rename(ubigeo = ubigeo_inei) %>% 
  relocate(anio, .before = ubigeo)

pob2022 <- pob2022 %>% 
  select(ubigeo, departamento:distrito, x0:x17, x0_2:x17_2) %>% 
  slice(2:1891)

pob2023 <- pob2023 %>% 
  select(ubigeo, departamento:distrito, x0:x17, x0_2:x17_2) %>% 
  slice(2:1891)

pob <- bind_rows(
  pob2020,
  pob2022, 
  pob2023,
  .id = "anio"
) %>% 
  mutate(
    anio = case_match(
      anio, 
      "1" ~ 2020,
      "2" ~ 2022,
      "3" ~ 2023
    )
  )

Finalmente se ordena la información a fin de poder unificarla con la población 2021 y tener una base unificada llamada poblacion.

In [13]:

pob <- pob %>%
  pivot_longer(
    cols = starts_with("x"),
    names_to = "name",
    values_to = "cantidad"
  ) %>%
  mutate(
    edad = as.numeric(str_extract(name, "\\d+")),
    sexo = case_when(
      str_detect(name, "_2") ~ "Female",
      TRUE ~ "Male"
    ),
    sexo = factor(sexo,
                  levels = c("Female",
                             "Male")),
    cantidad = if_else(is.na(cantidad), 0, cantidad)
  ) %>%
  select(-name) %>% 
  relocate(sexo, .after = distrito)

poblacion <- bind_rows(pob, 
                       pob2021) %>% 
  arrange(anio, ubigeo) %>% 
  mutate(
    grupo_edad = case_when(
      edad < 1 ~ "Under 1 year",
      edad <= 5 ~ "1 - 5 years",
      edad <= 11 ~  "6 - 11 years",
      edad <= 17 ~ "12 - 17 years"
    ),
    grupo_edad = factor(grupo_edad,
                        levels = c("Under 1 year",
                                   "1 - 5 years",
                                   "6 - 11 years",
                                   "12 - 17 years")),
    ubigeo = str_remove(ubigeo, "\\*"),
    distrito = str_remove(distrito, "\\/1"),
    distrito = str_squish(distrito)
  )


poblacion <- poblacion %>% 
  select(-c(departamento:distrito)) %>% 
  inner_join(
    peru_mother %>% 
      select(dep:ubigeo),
    by = join_by(ubigeo)
  ) %>% 
  relocate(
    anio, ubigeo,
    departamento = dep,
    provincia = prov,
    distrito = distr
  ) %>% 
  bind_rows(
    poblacion %>% 
    anti_join(
      peru_mother %>% 
        select(dep:ubigeo),
      by = join_by(ubigeo)
    ) 
  ) %>% 
  arrange(anio, ubigeo)


dep_ubigeo_clasif <- peru_mother %>% 
  filter(dep != "LIMA") %>% 
  distinct(dep, region, macrorregion) 

poblacion <- poblacion %>% 
  left_join(
    dep_ubigeo_clasif,
    by = c("departamento" = "dep")
  ) %>% 
  mutate(
    region = case_when(
      departamento == "LIMA" ~ "Coast",
      .default = region
    ),
    macrorregion = case_when(
      departamento == "LIMA" & provincia != "LIMA" ~ "Center",
      departamento == "LIMA" & provincia == "LIMA" ~ "Metropolitan Lima and Callao",
      .default = macrorregion
    )
  ) 

poblacion <- poblacion %>% 
  left_join(
    pobreza %>% 
      select(ubigeo, estimate_pobreza, cuartil_pobreza)    
  ) %>% 
  left_join(
    nbi %>% 
      select(ubigeo, estimate_nbi, cuartil_nbi)    
  )

Exportar datos

In [14]:

write_csv(poblacion,
          "01_data/processed/poblacion.csv")
write_rds(poblacion,
          "01_data/processed/poblacion.rds")

dbWriteTable(con, "poblacion", poblacion, overwrite = TRUE)
dbWriteTable(con, "dep_ubigeo_clasif", dep_ubigeo_clasif, overwrite = TRUE)

Fallecidos COVID-19

In [15]:

fallecidos <- read_csv2("01_data/raw/fallecidos_covid.csv",
                        name_repair = janitor::make_clean_names) %>%
  mutate(
    fecha_fallecimiento = ymd(fecha_fallecimiento),
    anio = year(fecha_fallecimiento),
    mes = month(fecha_fallecimiento),
    fecha_round = ceiling_date(fecha_fallecimiento, unit = "month"),
    .after = fecha_fallecimiento
  ) 

Corrección de dato Sexo

In [16]:

fallecidos_total <- fallecidos %>% 
  filter(!is.na(ubigeo)) %>% 
  select(-c(departamento:distrito)) %>% 
  inner_join(
    peru_mother %>% 
      select(dep:ubigeo)
  ) %>% 
  rename(
    departamento = dep,
    provincia = prov,
    distrito = distr
  ) %>% 
  bind_rows(
    fallecidos %>% 
      filter(is.na(ubigeo))
  ) %>% 
  # filter(edad_declarada < 18) %>%
  mutate(
    sexo = str_to_title(sexo),
    sexo = factor(sexo,
                  levels = c("Femenino",
                             "Masculino"),
                  labels = c("Female",
                             "Male")),
    grupo_edad = case_when(
      edad_declarada < 1 ~ "Under 1 year",
      edad_declarada <= 5 ~ "1 - 5 years",
      edad_declarada <= 11 ~  "6 - 11 years",
      edad_declarada <= 17 ~ "12 - 17 years"
    ),
    grupo_edad = factor(grupo_edad,
                        levels = c("Under 1 year",
                                   "1 - 5 years",
                                   "6 - 11 years",
                                   "12 - 17 years")),
    ola_covid = case_when(
      fecha_fallecimiento >= ymd("2020-03-01") &
        fecha_fallecimiento <=  ymd("2020-10-31") ~ "1 (Mar – Oct 2020)",
      fecha_fallecimiento >= ymd("2020-11-01") &
        fecha_fallecimiento <=  ymd("2021-10-31") ~ "2 (Nov 2020 – Oct 2021)",
      fecha_fallecimiento >= ymd("2021-11-01") &
        fecha_fallecimiento <=  ymd("2022-04-30") ~ "3 (Nov 2021 – Apr 2022)",
      fecha_fallecimiento >= ymd("2022-05-01") &
        fecha_fallecimiento <=  ymd("2022-10-31") ~ "4 (May 2022 – Oct 2022)",
      fecha_fallecimiento >= ymd("2022-11-01") ~ "5 (Nov 2022 – Jun 2023)",
      .default = "Inicio"
    ),
    ola_covid = factor(ola_covid,
                       levels = c("1 (Mar – Oct 2020)",
                                  "2 (Nov 2020 – Oct 2021)",
                                  "3 (Nov 2021 – Apr 2022)",
                                  "4 (May 2022 – Oct 2022)",
                                  "5 (Nov 2022 – Jun 2023)"))
  )


fallecidos_total <- fallecidos_total %>% 
  left_join(
    dep_ubigeo_clasif,
    by = c("departamento" = "dep")
  ) %>% 
  mutate(
    region = case_when(
      departamento == "LIMA" ~ "Coast",
      .default = region
    ),
    macrorregion = case_when(
      departamento == "LIMA" & provincia != "LIMA" ~ "Center",
      departamento == "LIMA" & provincia == "LIMA" ~ "Metropolitan Lima and Callao",
      .default = macrorregion
    )
  ) %>% 
  left_join(
    pobreza %>% 
      select(ubigeo, estimate_pobreza, cuartil_pobreza)    
  ) %>% 
  left_join(
    nbi %>% 
      select(ubigeo, estimate_nbi, cuartil_nbi)    
  )
In [17]:

dbWriteTable(con, "fallecidos_total", fallecidos_total, overwrite = TRUE)

Casos Positivos COVID-19

In [18]:

positivos <- read_csv2("01_data/raw/positivos_covid.csv",
                        name_repair = janitor::make_clean_names)

positivos <- positivos %>% 
  mutate(
    fecha_resultado = ymd(fecha_resultado),
    anio = year(fecha_resultado),
    mes = month(fecha_resultado),
    fecha_round = ceiling_date(fecha_resultado, unit = "month"),
    .after = fecha_resultado
  ) %>% 
  mutate(
    sexo = str_to_title(sexo),
    sexo = factor(sexo,
                  levels = c("Femenino",
                             "Masculino"),
                  labels = c("Female",
                             "Male")),
    
    grupo_edad = case_when(
      edad < 1 ~ "Under 1 year",
      edad <= 5 ~ "1 - 5 years",
      edad <= 11 ~  "6 - 11 years",
      edad <= 17 ~ "12 - 17 years"
    ),
    grupo_edad = factor(grupo_edad,
                        levels = c("Under 1 year",
                                   "1 - 5 years",
                                   "6 - 11 years",
                                   "12 - 17 years")),
    
    ola_covid = case_when(
      fecha_resultado >= ymd("2020-03-01") & 
        fecha_resultado <=  ymd("2020-10-31") ~ "1 (Mar – Oct 2020)",
      fecha_resultado >= ymd("2020-11-01") & 
        fecha_resultado <=  ymd("2021-10-31") ~ "2 (Nov 2020 – Oct 2021)",
      fecha_resultado >= ymd("2021-11-01") & 
        fecha_resultado <=  ymd("2022-04-30") ~ "3 (Nov 2021 – Apr 2022)",
      fecha_resultado >= ymd("2022-05-01") & 
        fecha_resultado <=  ymd("2022-10-31") ~ "4 (May 2022 – Oct 2022)",
      fecha_resultado >= ymd("2022-11-01") ~ "5 (Nov 2022 – Jun 2023)",
      .default = "Inicio"
    ),
    ola_covid = factor(ola_covid,
                       levels = c("1 (Mar – Oct 2020)",
                                  "2 (Nov 2020 – Oct 2021)",
                                  "3 (Nov 2021 – Apr 2022)",
                                  "4 (May 2022 – Oct 2022)",
                                  "5 (Nov 2022 – Jun 2023)"))
  ) %>% 
  filter(anio <= 2023)

positivos <- positivos %>% 
  left_join(
    dep_ubigeo_clasif,
    by = c("departamento" = "dep")
  ) %>% 
  mutate(
    region = case_when(
      departamento == "LIMA" ~ "Coast",
      .default = region
    ),
    macrorregion = case_when(
      departamento == "LIMA" & provincia != "LIMA" ~ "Center",
      departamento == "LIMA" & provincia == "LIMA" ~ "Metropolitan Lima and Callao",
      .default = macrorregion
    )
  ) 

positivos <- positivos %>% 
  left_join(
    pobreza %>% 
      select(ubigeo, estimate_pobreza, cuartil_pobreza)    
  ) %>% 
  left_join(
    nbi %>% 
      select(ubigeo, estimate_nbi, cuartil_nbi)    
  )
In [19]:

positivos_0723 <- read_csv2("01_data/raw/positivos_covid_040723.csv",
                            name_repair = janitor::make_clean_names)

positivos_0723 <- positivos_0723 %>% 
  filter(!is.na(ubigeo)) %>% 
  select(-c(departamento:distrito)) %>% 
  left_join(
    peru_mother %>% 
      select(dep:ubigeo)
  ) %>% 
  rename(
    departamento = dep,
    provincia = prov,
    distrito = distr
  ) %>% 
  bind_rows(
    positivos_0723 %>% 
      filter(is.na(ubigeo))
  ) %>% 
  mutate(
    fecha_resultado = ymd(fecha_resultado),
    anio = year(fecha_resultado),
    mes = month(fecha_resultado),
    fecha_round = ceiling_date(fecha_resultado, unit = "month"),
    .after = fecha_resultado
  ) %>% 
  mutate(
    sexo = str_to_title(sexo),
    sexo = factor(sexo,
                  levels = c("Femenino",
                             "Masculino"),
                  labels = c("Female",
                             "Male")),
    grupo_edad = case_when(
      edad < 1 ~ "Under 1 year",
      edad <= 5 ~ "1 - 5 years",
      edad <= 11 ~  "6 - 11 years",
      edad <= 17 ~ "12 - 17 years"
    ),
    grupo_edad = factor(grupo_edad,
                        levels = c("Under 1 year",
                                   "1 - 5 years",
                                   "6 - 11 years",
                                   "12 - 17 years")),
    
    ola_covid = case_when(
      fecha_resultado >= ymd("2020-03-01") & 
        fecha_resultado <=  ymd("2020-10-31") ~ "1 (Mar – Oct 2020)",
      fecha_resultado >= ymd("2020-11-01") & 
        fecha_resultado <=  ymd("2021-10-31") ~ "2 (Nov 2020 – Oct 2021)",
      fecha_resultado >= ymd("2021-11-01") & 
        fecha_resultado <=  ymd("2022-04-30") ~ "3 (Nov 2021 – Apr 2022)",
      fecha_resultado >= ymd("2022-05-01") & 
        fecha_resultado <=  ymd("2022-10-31") ~ "4 (May 2022 – Oct 2022)",
      fecha_resultado >= ymd("2022-11-01") ~ "5 (Nov 2022 – Jun 2023)",
      .default = "Inicio"
    ),
    ola_covid = factor(ola_covid,
                       levels = c("1 (Mar – Oct 2020)",
                                  "2 (Nov 2020 – Oct 2021)",
                                  "3 (Nov 2021 – Apr 2022)",
                                  "4 (May 2022 – Oct 2022)",
                                  "5 (Nov 2022 – Jun 2023)"))
  ) %>% 
  arrange(id_persona, fecha_resultado)
In [20]:

library(data.table)
library(dtplyr)
setDTthreads(parallel::detectCores())
In [21]:

positivos_0723_lazy <- lazy_dt(positivos_0723)

# Separar los registros con id_persona NA y asumir que todos son casos nuevos.
positivos_0723_na <- positivos_0723_lazy %>%
  filter(is.na(id_persona), edad < 18, sexo != "No registrado", !is.na(fecha_resultado)) %>%
  mutate(fecha_resultado_floor = floor_date(fecha_resultado, unit = "month")) %>% 
  as_tibble()

# Procesar los registros con id_persona válida.
positivos_0723_filtrados <- positivos_0723_lazy %>%
  filter(!is.na(id_persona), edad < 18, sexo != "No registrado",
         !is.na(fecha_resultado)) %>%
  arrange(id_persona, fecha_resultado) %>%
  group_by(id_persona) %>%
  mutate(
    dias_dif = fecha_resultado - lag(fecha_resultado),
    caso_inicial = is.na(dias_dif),
    duplicado = if_else(caso_inicial, FALSE, dias_dif <= 30),
    caso_intermedio = if_else(caso_inicial, FALSE, dias_dif > 30 & dias_dif <= months(3)),
    reinfeccion = if_else(caso_inicial, FALSE, dias_dif > months(3)),
    fecha_resultado_floor = floor_date(fecha_resultado, unit = "month")
  ) %>%
  ungroup() %>%
  filter(caso_inicial | caso_intermedio | reinfeccion) %>%
  select(-dias_dif) %>%  # Limpiamos las columnas que no necesitamos más
  as_tibble()

# Unir de nuevo los casos con NA en id_persona.
positivos_0723_filtrados <- bind_rows(
  positivos_0723_filtrados, 
  positivos_0723_na,
  positivos_0723 %>% 
    filter(is.na(fecha_resultado))
) 

positivos_0723_filtrados <- positivos_0723_filtrados %>% 
  left_join(
    dep_ubigeo_clasif,
    by = c("departamento" = "dep")
  ) %>% 
  mutate(
    region = case_when(
      departamento == "LIMA" ~ "Coast",
      .default = region
    ),
    macrorregion = case_when(
      departamento == "LIMA" & provincia != "LIMA" ~ "Center",
      departamento == "LIMA" & provincia == "LIMA" ~ "Metropolitan Lima and Callao",
      .default = macrorregion
    )
  ) 

positivos_0723_filtrados <- positivos_0723_filtrados %>% 
  left_join(
    pobreza %>% 
      select(ubigeo, estimate_pobreza, cuartil_pobreza)    
  ) %>% 
  left_join(
    nbi %>% 
      select(ubigeo, estimate_nbi, cuartil_nbi)    
  )


# positivos_0723_filtrados_lazy <- lazy_dt(positivos_0723_filtrados)
# 
# # Calcular la incidencia mensual con todos los casos incluidos.
# incidencia_mensual_0723 <- positivos_0723_filtrados_lazy %>%
#   mutate(
#     fecha_resultado_floor = floor_date(fecha_resultado, unit = "month")
#   ) %>%
#   group_by(fecha_resultado_floor) %>%
#   summarise(
#     casos = n()  # Contabiliza todos los casos, incluyendo los asumidos como nuevos con id_persona NA
#   ) %>%
#   ungroup() %>% 
#   as_tibble()
In [22]:

dbWriteTable(con, "positivos", positivos, overwrite = TRUE)
dbWriteTable(con, "positivos_0723", positivos_0723_filtrados, overwrite = TRUE)
#dbWriteTable(con, "incidencia_mensual_0723", incidencia_mensual_0723, overwrite = TRUE)
In [23]:
positivos_0723 <- tbl(con, "positivos_0723")

max_positivos_0723 <- positivos_0723 %>% 
  summarise(max = max(fecha_resultado)) %>% 
  pull(max)
Warning: Missing values are always removed in SQL aggregation functions.
Use `na.rm = TRUE` to silence this warning
This warning is displayed once every 8 hours.

Vacunación

In [24]:

duckdb_read_csv(con, 
                "vacunas_pre", 
                "01_data/raw/vacunas_covid.csv",
                lower.case.names = TRUE)


# dbSendQuery(
#   con,
#   "DROP VIEW IF EXISTS vacunas_pre"
# )
# dbRemoveTable(con, "vacunas_pre")
# dbSendQuery(con, "CREATE TABLE vacunas_pre AS SELECT * FROM vacunas")
In [25]:

# dbSendQuery(
#   con,
#   "DROP VIEW IF EXISTS vacunas"
# )

vacunas_pre <- tbl(con, "vacunas_pre")
dep_ubigeo_clasif <- tbl(con, "dep_ubigeo_clasif")
pobreza <- tbl(con, "pobreza")
nbi <- tbl(con, "nbi")
In [26]:

vacunas <- vacunas_pre %>% 
  mutate(
    departamento = case_when(
      is.na(departamento) ~ diresa,
      .default = departamento
    ),
    across(
      departamento:distrito,
      ~ str_replace(., "Ñ", "N")
    ),
    across(
      departamento:distrito,
      ~ str_replace(., "-", " ")
    ),
    provincia = case_match(
      provincia,
      "NAZCA" ~ "NASCA",
      .default = provincia
    ),
    distrito = case_when(
      distrito == "NAZCA" ~ "NASCA",
      distrito == "QUIMBIRI" ~ "KIMBIRI",
      distrito == "CORONEL GREGORIO ALBARRACIN LANCHIP" ~ "CORONEL GREGORIO ALBARRACIN LANCHIPA",
      distrito == "SAN JUAN DE YSCOS" ~ "SAN JUAN DE ISCOS",
      departamento == "APURIMAC" & distrito == "HUAYLLO" ~ "IHUAYLLO",
      departamento == "ANCASH" & provincia == "HUARAZ" & distrito == "PAMPAS" ~ "PAMPAS GRANDE",
      departamento == "LIMA" & distrito == "AYAUCA" ~ "ALLAUCA",
      departamento == "CAJAMARCA" & distrito == "SANTA CRUZ DE TOLEDO" ~ "SANTA CRUZ DE TOLED",
      departamento == "AYACUCHO" & distrito == "HUAYA" ~ "HUALLA",
      departamento == "HUANUCO" & distrito == "QUISQUI" ~ "QUISQUI (KICHKI)",
      departamento == "HUANUCO" & distrito == "DANIEL ALOMIAS ROBLES" ~ "DANIEL ALOMIA ROBLES",
      departamento == "AYACUCHO" & distrito == "HUAYA" ~ "HUALLA",
      departamento == "TACNA" & distrito == "CHUCATAMANI" ~ "HEROES ALBARRACIN",
      departamento == "LIMA" & provincia == "HUAROCHIRI" & distrito == "LARAOS" ~ "SAN PEDRO DE LARAOS",
      .default = distrito
    ),
  ) %>% 
  left_join(
    dep_ubigeo_clasif,
      by = c("departamento" = "dep")
  ) %>% 
  left_join(
    pobreza %>% 
      select(departamento:distrito, estimate_pobreza, cuartil_pobreza)    
  ) %>% 
  left_join(
    nbi %>% 
      select(departamento:distrito, estimate_nbi, cuartil_nbi)    
  ) %>% 
  mutate(
    region = case_when(
      departamento == "LIMA" ~ "Coast",
      .default = region
    ),
    macrorregion = case_when(
      departamento == "LIMA" & provincia != "LIMA" ~ "Center",
      departamento == "LIMA" & provincia == "LIMA" ~ "Metropolitan Lima and Callao",
      .default = macrorregion
    )
  ) %>% 
  to_arrow() %>% 
  mutate(
    fecha_vacunacion = ymd(fecha_vacunacion),
    anio = year(fecha_vacunacion),
    mes = month(fecha_vacunacion),
    fecha_round = ceiling_date(fecha_vacunacion, unit = "month"),
    .after = fecha_vacunacion
  ) %>% 
  mutate(
    edad = abs(edad),
    grupo_edad = case_when(
      edad < 1 ~ "Under 1 year",
      edad <= 5 ~ "1 - 5 years",
      edad <= 11 ~  "6 - 11 years",
      edad <= 17 ~ "12 - 17 years"
    ),
    anio = year(fecha_vacunacion),
    ola_covid = case_when(
      fecha_vacunacion >= ymd("2020-03-01") & 
        fecha_vacunacion <=  ymd("2020-10-31") ~ "1 (Mar – Oct 2020)",
      fecha_vacunacion >= ymd("2020-11-01") & 
        fecha_vacunacion <=  ymd("2021-10-31") ~ "2 (Nov 2020 – Oct 2021)",
      fecha_vacunacion >= ymd("2021-11-01") & 
        fecha_vacunacion <=  ymd("2022-04-30") ~ "3 (Nov 2021 – Apr 2022)",
      fecha_vacunacion >= ymd("2022-05-01") & 
        fecha_vacunacion <=  ymd("2022-10-31") ~ "4 (May 2022 – Oct 2022)",
      fecha_vacunacion >= ymd("2022-11-01") ~ "5 (Nov 2022 – Jun 2023)",
      .default = "Inicio"
    )
  ) %>% 
  compute()

vacunas$sexo <- chunked_array(
  factor(
    vacunas$sexo$as_vector(),
    levels = c("FEMENINO", "MASCULINO"),
    labels = c("Female", "Male")
  ), 
  type = dictionary(int8())
)

vacunas$grupo_edad <- chunked_array(
  factor(
    vacunas$grupo_edad$as_vector(),
    levels = c("Under 1 year",
               "1 - 5 years",
               "6 - 11 years",
               "12 - 17 years")
  ), 
  type = dictionary(int8())
)

vacunas$ola_covid <- chunked_array(
  factor(
    vacunas$ola_covid$as_vector(),
    levels = c("1 (Mar – Oct 2020)",
               "2 (Nov 2020 – Oct 2021)",
               "3 (Nov 2021 – Apr 2022)",
               "4 (May 2022 – Oct 2022)",
               "5 (Nov 2022 – Jun 2023)")
  ), 
  type = dictionary(int8())
)

dbRemoveTable(con, "vacunas")

duckdb_register(
  con,
  "vacunas",
  vacunas
)

vacunas <- tbl(con, "vacunas")

dbSendQuery(con, "CREATE TABLE vacunas AS SELECT * FROM vacunas")
In [27]:

dbRemoveTable(con, "vacunas_18")
vacunas <- tbl(con, "vacunas")
In [28]:

vacunas_18 <- vacunas %>% 
  filter(edad < 18,
         fecha_vacunacion <= max_positivos_0723) %>% 
  compute(name = "vacunas_18", temporary = FALSE)

Hospitalizados

In [29]:

hospitalizados <- read_csv2("01_data/raw/TB_HOSP_VAC_FALLECIDOS.csv",
                            name_repair = janitor::make_clean_names)

# duckdb_read_csv(con,
#                 "hospitalizados",
#                 "01_data/raw/TB_HOSP_VAC_FALLECIDOS.csv",
#                 lower.case.names = TRUE,
#                 delim = ";")

hospitalizados <- hospitalizados %>% 
  mutate(
    # sexo = case_when(
    #   sexo == "F" ~ "Femenino",
    #   sexo == "M" ~ "Masculino"
    # ),
    sexo = factor(
      sexo,
      levels = c("F", "M"),
      labels = c("Female", "Male")
    ),
  ) %>% 
  mutate(
    fecha_ingreso_hosp = dmy(fecha_ingreso_hosp),
    anio = year(fecha_ingreso_hosp),
    mes = month(fecha_ingreso_hosp),
    fecha_round = ceiling_date(fecha_ingreso_hosp, unit = "month"),
    .after = fecha_ingreso_hosp
  ) 
In [30]:

dbWriteTable(con, "hospitalizados", hospitalizados, overwrite = TRUE)
In [31]:

hospitalizados <- tbl(con, "hospitalizados")
vacunas <- tbl(con, "vacunas")
positivos_0723 <- tbl(con, "positivos_0723")
peru_mother <- tbl(con, "peru_mother")


hospitalizados <- hospitalizados %>% 
  select(-c(dep_domicilio:dist_domicilio)) %>% 
  rename(ubigeo = ubigeo_inei_domicilio) %>% 
  inner_join(
    peru_mother %>% 
      select(dep:ubigeo),
    by = join_by(ubigeo)
  ) %>% 
  rename(
    departamento = dep,
    provincia = prov,
    distrito = distr,
  ) %>% 
  relocate(ubigeo, departamento:distrito)


hospitalizados <- hospitalizados %>% 
  left_join(
    dep_ubigeo_clasif,
      by = c("departamento" = "dep")
  ) %>% 
  left_join(
    pobreza %>% 
      select(ubigeo, estimate_pobreza, cuartil_pobreza)    
  ) %>% 
  left_join(
    nbi %>% 
      select(ubigeo, estimate_nbi, cuartil_nbi)    
  ) %>% 
  mutate(
    region = case_when(
      departamento == "LIMA" ~ "Coast",
      .default = region
    ),
    macrorregion = case_when(
      departamento == "LIMA" & provincia != "LIMA" ~ "Center",
      departamento == "LIMA" & provincia == "LIMA" ~ "Metropolitan Lima and Callao",
      .default = macrorregion
    )
  )


vacunas_info_sex <- vacunas %>%
  select(id_persona = uuid, sexo) 

vacunas_info_sex <- vacunas_info_sex %>% 
  group_by(id_persona) %>% 
  add_count(sexo) %>% 
  ungroup() %>% 
  window_order(id_persona, desc(n)) %>% 
  distinct(id_persona, .keep_all = TRUE) %>% 
  select(-n)

positivos_0723_info_sex <- positivos_0723 %>% 
  select(id_persona, sexo) 

positivos_0723_info_sex <- positivos_0723_info_sex %>% 
  group_by(id_persona) %>% 
  add_count(sexo) %>% 
  ungroup() %>% 
  window_order(id_persona, desc(n)) %>% 
  distinct(id_persona, .keep_all = TRUE) %>% 
  select(-n)

hospitalizados_fix_sexo1 <- hospitalizados %>%
  filter(is.na(sexo)) %>%
  select(-sexo) %>%
  left_join(
    vacunas_info_sex,
    by = join_by(id_persona)
  ) %>%
  relocate(sexo, .after = id_persona)
  # collect() %>%
  # mutate(
  #   sexo = factor(
  #     sexo,
  #     levels = c("FEMENINO", "MASCULINO"),
  #     labels = c("Femenino", "Masculino")
  #   )
  # ) %>%
  # arrow::to_duckdb()

# Se intentó hacer lo mismo con los casos positivos, pero no se recuperó ninguna 
# información

# hospitalizados_fix_sexo2 <- hospitalizados_fix_sexo1 %>% 
#   filter(is.na(sexo)) %>%
#   select(-sexo) %>%
#   left_join(
#     positivos_0723_info_sex,
#     by = join_by(id_persona)
#   ) %>% 
#   relocate(sexo, .after = id_persona)
In [32]:

hosp1 <- hospitalizados %>%
  filter(!is.na(sexo)) %>%
  to_arrow() %>% 
  compute()

hosp2 <- hospitalizados_fix_sexo1 %>% 
  to_arrow() %>% 
  compute()

hosp_final <- concat_tables(hosp1,
                            hosp2)

# hosp_final <- hospitalizados %>%
#   filter(!is.na(sexo)) %>% 
#   union_all(
#     hospitalizados_fix_sexo1
#   )

hosp_final <- hosp_final %>% 
  mutate(
    grupo_edad = case_when(
      edad < 1 ~ "Under 1 year",
      edad <= 5 ~ "1 - 5 years",
      edad <= 11 ~  "6 - 11 years",
      edad <= 17 ~ "12 - 17 years"
    ),
    anio = year(fecha_ingreso_hosp),
    ola_covid = case_when(
      fecha_ingreso_hosp >= ymd("2020-03-01") & 
        fecha_ingreso_hosp <=  ymd("2020-10-31") ~ "1 (Mar – Oct 2020)",
      fecha_ingreso_hosp >= ymd("2020-11-01") & 
        fecha_ingreso_hosp <=  ymd("2021-10-31") ~ "2 (Nov 2020 – Oct 2021)",
      fecha_ingreso_hosp >= ymd("2021-11-01") & 
        fecha_ingreso_hosp <=  ymd("2022-04-30") ~ "3 (Nov 2021 – Apr 2022)",
      fecha_ingreso_hosp >= ymd("2022-05-01") & 
        fecha_ingreso_hosp <=  ymd("2022-10-31") ~ "4 (May 2022 – Oct 2022)",
      fecha_ingreso_hosp >= ymd("2022-11-01") ~ "5 (Nov 2022 – Jun 2023)",
      .default = "Inicio"
    )
  ) %>% 
  compute()

hosp_final$grupo_edad <- chunked_array(
  factor(
    hosp_final$grupo_edad$as_vector(),
    levels = c("Under 1 year",
               "1 - 5 years",
               "6 - 11 years",
               "12 - 17 years")
  ), 
  type = dictionary(int8())
)

hosp_final$ola_covid <- chunked_array(
  factor(
    hosp_final$ola_covid$as_vector(),
    levels = c("1 (Mar – Oct 2020)",
               "2 (Nov 2020 – Oct 2021)",
               "3 (Nov 2021 – Apr 2022)",
               "4 (May 2022 – Oct 2022)",
               "5 (Nov 2022 – Jun 2023)")
  ), 
  type = dictionary(int8())
)
  
dbRemoveTable(con, "hosp_final")

# dbSendQuery(
#   con,
#   "DROP VIEW IF EXISTS hosp_final"
# )

duckdb_register(
  con,
  "hosp_final",
  hosp_final
)

hosp_final <- tbl(con, "hosp_final")

dbSendQuery(con, "CREATE TABLE hosp_final AS SELECT * FROM hosp_final")
In [33]:

# write_dataset(
#   hosp_final,
#   "01_data/processed/hosp_final",
#   format = "parquet"
# )
# 
# to_duckdb(
#   hosp_final,
#   con,
#   "hosp_final"
# )
# 
# dbSendQuery(con, "CREATE TABLE hosp_final AS SELECT * FROM hosp_final")

# dbWriteTable(con, "hospitalizados", hosp_final, overwrite = TRUE)

Persona

In [34]:

duckdb_read_csv(con, 
                "personas", 
                "01_data/raw/TB_PERSONA.csv",
                lower.case.names = TRUE,
                delim = ";")
In [35]:
personas <- tbl(con, "personas")
personas
# Source:   table<personas> [?? x 6]
# Database: DuckDB v0.10.1 [brian@Windows 10 x64:R 4.4.0/D:\Github\covid-analisis-ninos\01_data\raw\covid.duckdb]
   id_persona anho_nac sexo  id_ubigeo_domicilio fecha_fallecido padron_reniec
        <int>    <int> <chr>               <int> <chr>                   <int>
 1    1437213     1950 F                      NA <NA>                       NA
 2    1437254     1952 M                    1575 <NA>                        1
 3    1437291     1963 M                    1575 <NA>                        1
 4    1437315     1963 F                    1575 <NA>                        1
 5    1437317     1966 F                     695 <NA>                        1
 6    1437349     1944 F                    1573 <NA>                        1
 7    1437351     1939 M                    1573 <NA>                        1
 8    1437356     1974 M                    1573 <NA>                        1
 9    1437357     1962 F                    1573 <NA>                        1
10    1437383     1966 F                    1288 <NA>                        1
# ℹ more rows
In [36]:
dbDisconnect(con, shutdown=TRUE)